﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;

/// <summary>
/// Descripción breve de TipoProceso
/// </summary>
namespace Iudicium.Procesos.CRN
{
    public class TipoProcesoCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");
        
        public TipoProcesoCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertTipoProceso(TipoProceso objTipoProceso)
        {
            if (objTipoProceso == null)
            {
                throw new ArgumentException("La TipoProceso no puede ser nula.");
            }

            if (string.IsNullOrEmpty(objTipoProceso.Descripcion))
            {
                throw new ArgumentException("La descripcion de la TipoProceso no puede ser nula o vacia");
            }

            int? tipoProcesoId = 0;

            TipoProcesoDSTableAdapters.TipoProcesoTableAdapter adapter = 
                new TipoProcesoDSTableAdapters.TipoProcesoTableAdapter();

            adapter.Insert(ref tipoProcesoId, objTipoProceso.Descripcion);

            if (tipoProcesoId == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return tipoProcesoId.Value;
        }

        public static void UpdateTipoProceso(TipoProceso objTipoProceso)
        {
            if (objTipoProceso == null)
            {
                throw new ArgumentException("La TipoProceso no puede ser nula.");
            }
            if (objTipoProceso.TipoprocesoId <= 0)
            {
                throw new ArgumentException("TipoProcesoId no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(objTipoProceso.Descripcion))
            {
                throw new ArgumentException("La descripcion de la TipoProceso no puede ser nula o vacia");
            }
            TipoProcesoDSTableAdapters.TipoProcesoTableAdapter adpater =
                   new TipoProcesoDSTableAdapters.TipoProcesoTableAdapter();

            adpater.Update(objTipoProceso.TipoprocesoId, objTipoProceso.Descripcion);

        }

        public static void DeleteTipoProceso(int TipoProcesoId)
        {
            if (TipoProcesoId <= 0)
            {
                throw new ArgumentException("TipoProcesoId no puede ser menor o igual que cero.");
            }
            TipoProcesoDSTableAdapters.TipoProcesoTableAdapter adpater =
                  new TipoProcesoDSTableAdapters.TipoProcesoTableAdapter();

            adpater.Delete(TipoProcesoId);

        }

        public static TipoProceso GetTipoProcesoById(int TipoProcesoId)
        {
            if (TipoProcesoId <= 0)
            {
                throw new ArgumentException("TipoProcesoId no puede ser menor o igual que cero.");
            }

            TipoProcesoDSTableAdapters.TipoProcesoTableAdapter adpater =
                new TipoProcesoDSTableAdapters.TipoProcesoTableAdapter();

            TipoProcesoDS.TipoProcesoDataTable tabla =
                adpater.GetTipoProcesoById(TipoProcesoId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener el tipo proceso " + TipoProcesoId + " de la base de datos");
            }
            return ConstruirTipoProceso(tabla[0]);
        }

        public static List<TipoProceso> GetTipoProcesoBySearch(string parametro)
        {
            List<TipoProceso> lista = new List<TipoProceso>();

            TipoProcesoDSTableAdapters.TipoProcesoTableAdapter adpater =
                  new TipoProcesoDSTableAdapters.TipoProcesoTableAdapter();

            TipoProcesoDS.TipoProcesoDataTable tabla =
                adpater.GetTipoProcesoBySearch(parametro);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (TipoProcesoDS.TipoProcesoRow row in tabla)
            {
                TipoProceso obj = ConstruirTipoProceso(row);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static TipoProceso GetTipoProcesoByEtapa(int EtapaProcesoId)
        {
            if (EtapaProcesoId <= 0)
            {
                throw new ArgumentException("EtapaProcesoId no puede ser menor o igual que cero.");
            }

            TipoProcesoDSTableAdapters.TipoProcesoTableAdapter adpater =
                new TipoProcesoDSTableAdapters.TipoProcesoTableAdapter();

            TipoProcesoDS.TipoProcesoDataTable tabla =
                adpater.GetTipoByEtapa(EtapaProcesoId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener el tipo proceso con etapa" + EtapaProcesoId + " de la base de datos");
            }
            return ConstruirTipoProceso(tabla[0]);
        }

        public static TipoProceso ConstruirTipoProceso(TipoProcesoDS.TipoProcesoRow row)
        {
            if (row == null)
                return null;
            return new TipoProceso(row.TipoProcesoId, row.descripcion);

        }

    }
}
